package nige.volum.core;

import java.io.File;
import java.util.Vector;

import nige.volum.utils.Attente;

/**
 * Scan les dossier
 * @author Nicolas Genevaux
 *
 */
public class ScanFolder extends Thread {
	
	/**
	 * Nom du dossier a scanner
	 */
	private String dossier = "";
	/**
	 * Vecteur contenant tous les langages
	 */
	private Vector<Langage> langages = null;
	
	/**
	 * Constructeur de la classe
	 * @param folder Nom du dossier a scanner
	 * @param lang Vecteur contenant tous les langages
	 */
	public ScanFolder(String folder,Vector<Langage> lang) {
		langages = lang;
		dossier = folder;
	}
	
	/**
	 * Demarrage du thread
	 * Boucle dans un dossier
	 * Si dossier, creation d'un nouveau 
	 * thread dossier
	 * Si fichier, creation d'un nouveau 
	 * thread fichier
	 */
	public void run() {
		Attente.actionRealisee++;
		while(Attente.threadslances>Attente.threadsmax) {
			Attente.actionRealisee++;
			Attente.perform(1000);
		}
		Attente.threadslances++;
		File f = new File(dossier);
		File[] listFichier = f.listFiles();
		int finFor = listFichier.length;
		// Parcours la liste des fichiers dans
		// le dossier
		for(int i=0;i<finFor;i++) {
			performObjet(listFichier[i]);
			Attente.actionRealisee++;
		}
		listFichier = null;
		Attente.threadslances--;
	}
	
	/**
	 * 
	 * @param fichier
	 */
	private void performObjet(File fichier) {
		if(fichier.isDirectory()) {
			// Attend la liberation de ressources avant
			// de lancer un nouveau thread
			while(Attente.threadslances>Attente.threadsmax) {
				Attente.perform(1000);
			}
			// Quand assez de ressources
			// Lancement d'un nouveau scan de dossier
			(new ScanFolder(fichier.toString(),langages)).
				start();
		}
		else {
			ScanFile.fichierTotalScanne++;
			// Si c'est un fichier on le traite
			estUnFichier(fichier);
		}
	}
	
	/**
	 * Si l'objet est un fichier
	 * On cherche son langage
	 * On le scan
	 * @param Fichier Fichier a scanner
	 */
	private void estUnFichier(File Fichier) {
		boolean findTechno = false;
		boolean findExtens = false;
		int finFor = langages.size();
		for(int j=0;j<finFor;j++) {
			if(langages.get(j).scan(Fichier.
					toString())) {
				j = langages.size();
				findTechno = true;
			}
		}
		if(!findTechno) {
			if(langages.size()>0) {
				String ext = "";
				if(Fichier.toString().lastIndexOf(".")>=0) {
					ext = Fichier.toString().
							substring(
							Fichier.toString().
							lastIndexOf(".")+1);
				}
				else {
					ext = Fichier.toString().substring(
							Fichier.toString().lastIndexOf(
									System.
										getProperty("file.separator"))+1);
				}
				findExtens = false;
				/***************ADDITION******************
				finFor = langages.get(0).
					getResultExtension().size();
				for(int j=0;j<finFor;j++) {
					if(langages.get(0).
							getResultExtension().get(j).
							getExtLan().equals(ext)
							) {
						langages.get(0).getResultExtension().
							get(j).setNombreFichier(
								langages.get(0).getResultExtension().
								get(j).getNombreFichier()+1);
						j = langages.get(0).
							getResultExtension().size();
						findExtens = true;
					}
				}
				*************************************************/
				if(!findExtens) {
					ResultExtLan res = 
						new ResultExtLan();
					res.setExtLan(ext);
					res.setNombreFichier(1);
					res.setNomFichier(Fichier.toString());
					langages.get(0).getResultExtension().add(res);
				}
			}
		}
	}
	
}
